코드 리뷰
JDBC 라이브러리 구현하기 미션 3단계(2)
-
현재 구현 코드를 보면, TransactionManager 를 통해 DB와 통신하는 경우에는 TransactionManager 에서 connection 이 close() 되지만, 그렇지 않은경우 (예를 들어 UserService#findById 또는 insert) 같은 경우는 close가 되지 않고 있다.
꼭 트랜잭션을 걸어줘야만 connection이 close 되는게 좋은걸까?
⇒커넥션을 오랫동안 붙잡고 있는 게 꼭 좋은 방법은 아니라는 생각이 들었음. 그래서 JdbcTemplate의 메서드에 finally 구문을 추가하고, 현재 트랜잭션이 활성화되었는지 여부에 따라 커넥션을 해제해주는 분기를 추가해주었음.
private <T> T tryCatchTemplate(final StatementExecutor<T> executor, final String sql, final Object... obj) { final Connection conn = DataSourceUtils.getConnection(dataSource); try (final PreparedStatement pstmt = getPreparedStatement(sql, obj, conn)) { log.debug("query : {}", sql); return executor.execute(pstmt); } catch (SQLException exception) { log.error(exception.getMessage(), exception); throw new DataAccessException(exception); } finally { releaseConnectionIfInactiveTransaction(conn); } } private void releaseConnectionIfInactiveTransaction(final Connection conn) { try { if (conn.getAutoCommit()) DataSourceUtils.releaseConnection(conn, dataSource); } catch (SQLException e) { throw new DataAccessException(e); } }